package com.ruoyi.project.relation.mapper.provider

import com.ruoyi.project.relation.mapper.domain.GlobalUpdateBitColumnMO
import com.ruoyi.project.relation.mapper.domain.GlobalUpdateMultipleBitColumn
import org.apache.commons.lang3.StringUtils
import java.lang.RuntimeException
import org.apache.ibatis.jdbc.SQL
import org.shoukaiseki.common.utils.MybatisUtils
import org.shoukaiseki.common.utils.NumberUtils

/**
 *
 */
class GlobalSqlProvider {


    fun updateBitColumn(globalUpdateBitColumnMO: GlobalUpdateBitColumnMO): String {
        val tableName = globalUpdateBitColumnMO.tableName
        val attrName = globalUpdateBitColumnMO.attrName
        //如果tableIdName为空,默认使用 表名_id
        val tableIdName = globalUpdateBitColumnMO.tableIdName ?:tableName+ MybatisUtils.SEPARATOR_ID
        if (StringUtils.isEmpty(tableName)) {
            throw RuntimeException("表名不能为空")
        }
        if (StringUtils.isEmpty(attrName)) {
            throw RuntimeException("要更新的字段名不能为空")
        }
        val setbBitAttrValue = globalUpdateBitColumnMO.setbBitAttrValue
        val clrBitAttrValue = globalUpdateBitColumnMO.clrBitAttrValue
        val attrValue = globalUpdateBitColumnMO.attrValue
        if (NumberUtils.isLessZero(attrValue)) {
            throw RuntimeException("processStatus 不能小于0")
        }
        if (NumberUtils.isLessZero(setbBitAttrValue)) {
            throw RuntimeException("setbBitProcessStatus 不能小于0")
        }
        if (NumberUtils.isLessZero(clrBitAttrValue)) {
            throw RuntimeException("clrBitProcessStatus 不能小于0")
        }
        val sql: String
        //        org.shoukaiseki.common.utils.StringUtils dasf;
        sql = object : SQL() {
            init {
                UPDATE(tableName)
                if (globalUpdateBitColumnMO.attrValue != null) {
                    SET("$attrName=$attrValue")
                } else {
                    if (setbBitAttrValue != null && clrBitAttrValue != null) {
                        SET("$attrName=($attrName|$setbBitAttrValue)&~$clrBitAttrValue")
                    } else {
                        if (setbBitAttrValue != null) {
                            SET("$attrName=$attrName|$setbBitAttrValue")
                        } else {
                            SET("$attrName=$attrName&~$clrBitAttrValue")
                        }
                    }
                }
                WHERE("${globalUpdateBitColumnMO.tableIdName}=#{ownerId}")
            }
        }.toString()
        return sql
    }


    fun updateMultipleBitColumn(globalUpdateMultipleBitColumn: GlobalUpdateMultipleBitColumn): String {
        val tableName =globalUpdateMultipleBitColumn.tableName
        val tableIdName =globalUpdateMultipleBitColumn.tableIdName
        val ownerId =globalUpdateMultipleBitColumn.ownerId
        val sql: String
        //        org.shoukaiseki.common.utils.StringUtils dasf;
        sql = object : SQL() {
            init {
                UPDATE(tableName)
                for( globalUpdateBitColumnMO in globalUpdateMultipleBitColumn.globalUpdateBitColumnMOList){
                    val attrValue=globalUpdateBitColumnMO.attrValue
                    val attrName=globalUpdateBitColumnMO.attrName
                    val setbBitAttrValue=globalUpdateBitColumnMO.setbBitAttrValue
                    val clrBitAttrValue=globalUpdateBitColumnMO.clrBitAttrValue
                    if (attrValue != null) {

                        SET("$attrName=$attrValue")
                    } else {
                        if (setbBitAttrValue != null && clrBitAttrValue != null) {
                            SET("$attrName=($attrName|$setbBitAttrValue)&~$clrBitAttrValue")
                        } else {
                            if (setbBitAttrValue != null) {
                                SET("$attrName=$attrName|$setbBitAttrValue")
                            } else {
                                SET("$attrName=$attrName&~$clrBitAttrValue")
                            }
                        }
                    }
                }
                WHERE("${tableIdName}=${ownerId}")
            }
        }.toString()
        return sql

    }
}